package com.devops.admin.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.devops.admin.mapper.DOSProjectModuleMapper;
import com.devops.admin.model.DOSProjectModule;
import com.devops.admin.service.DOSProjectModuleService;
import com.devops.admin.util.Assert;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @ClassNem DOSProjectModuleServiceImpl
 * @Description TODO
 * @Author heyabo
 * @Date 2022/3/22 14:37
 * @Version 1.0
 **/
@Service
public class DOSProjectModuleServiceImpl extends ServiceImpl<DOSProjectModuleMapper, DOSProjectModule> implements DOSProjectModuleService {

    @Override
    public List<DOSProjectModule> getModuleByProjectId(Integer projectId) {
        checkProjectModulePermission(projectId);
        LambdaQueryWrapper<DOSProjectModule> queryWrapper = new LambdaQueryWrapper();
        queryWrapper.eq(DOSProjectModule::getProjectId,projectId);
        List<DOSProjectModule> list = this.list(queryWrapper);
        return list;
    }

    @Override
    public DOSProjectModule saveProjectModule(DOSProjectModule module) {
        Assert.isTrueMvc(module != null
                && module.getProjectId() != null
                && StrUtil.isNotBlank(module.getModuleName()),"ProjectId和ModuleName不能为空");
        checkProjectModulePermission(module.getProjectId());
        Assert.isTrue(count(Wrappers.<DOSProjectModule>lambdaQuery().eq(DOSProjectModule::getProjectId, module.getProjectId())
                .eq(DOSProjectModule::getModuleName, module.getModuleName())) == 0,"无法创建相同名称的module");
        save(module);
        return module;
    }

    @Override
    public Boolean updateProjectModule(DOSProjectModule module) {
        Assert.isTrueMvc(module != null && module.getId() != null && module.getId() > 0,"id不能为空");
        Assert.isTrueMvc(module.getProjectId() != null && module.getProjectId() > 0,"projectId不能为空");
        Assert.isTrueMvc(StrUtil.isNotBlank(module.getModuleName()),"moduleName不能为空");

        List<DOSProjectModule> list = list(Wrappers.<DOSProjectModule>lambdaQuery().eq(DOSProjectModule::getProjectId,module.getProjectId()));
        AtomicInteger count = new AtomicInteger();
        list.forEach(m->{
            if (module.getId().intValue() != m.getId().intValue()
                    && m.getModuleName().equals(module.getModuleName())){
                count.set(1);
            }
        });
        Assert.isTrue(count.get()==0,"无法更新相同名称的module");
        return updateById(module);
    }

    @Override
    public Boolean deleteProjectModule(Integer id) {
        Assert.isTrueMvc(id != null && id > 0,"id不能为空");
        return removeById(id);
    }

    /**
     * 根据projectId校验是否对projectModule有读写权限
     * 暂时不重要 可为空 后期可实现
     * @param projectId
     */
    public void checkProjectModulePermission(Integer projectId) {

    }
}
